home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Compendium Deluxe 2
/
LSD and 17bit Compendium Deluxe - Volume II.iso
/
a
/
prog
/
asmsrc
/
tomlanvec.lha
/
Thomas-landspurg-source
/
3d_source.s
next >
Wrap
Text File
|
1990-09-26
|
19KB
|
835 lines
; ***************************************
; * Affichage d'un objet en 3D filiaire *
; * par Thomas LANDSPURG *
; * IMPORTANT: *
; * this version is for Devpack *
; * Need the file datasin *
; ***************************************
task_stop=1 ; if we want to be in singletask mode
NB_POINTS_MAX=100 ; number max of point
TAILLEY=256
speed_dep=2
speed_rot=3
prof=1 ; nb de bitplanes de l'ecran
;EXEC
execbase=4
openlib=-408
closelib=-414
AllocMem=-$c6
FreeMem=-$d2
Forbid=-132
Permit=-138
MEMF_CLEAR=$10000
MEMF_CHIP=2
;GRAPHICS
OwnBlitter=-456
DisOwnBlitter=-462
; Hardware registers
COPRBASE=$dff000
DMACONR=2
BLTADAT=$74
BLTBDAT=$72
BLTCDAT=$70
BLTAFWM=$44
BLTALWM=$46
BLTAMOD=$64
BLTBMOD=$62
BLTCMOD=$60
BLTDMOD=$66
BLTCON0=$40
BLTCON1=$42
BLTSIZE=$58
BLTAPTH=$50
BLTBPTH=$4c
BLTCPTH=$48
BLTDPTH=$54
COP1LCH=$80
COPJMP1=$88
DMACON=$96
VHPOSR=6
start:
bsr in_wb
bsr initlib ; ouvre les librairies
; ALLOCATION MEMOIRE DE L'ECRAN
move.l execbase,a6
move.l #taillescr*2,d0 ; taille*2 car double buffering
move.l #MEMF_CLEAR+MEMF_CHIP,d1
jsr AllocMem(a6)
tst.l d0 ; d0 pointe sur la zone memoire
beq erreur_mem ; si d0=0,l'allocation n'a pas eu lieu
move.l d0,abitplane0 ; pointeur sur le premier ecran
move.l d0,bitplane0
add.l #taillescr,d0
move.l d0,bbitplane0 ; pointeur sur le deuxieme ecran
; ALLOCATION MEMOIRE DE LA COPPERLIST
move.l execbase,a6 ;reserve de la memoire pour la coplist
move.l #taillecop,d0 ; la taille a ete choisie large
move.l #$10002,d1 ; la coplist doit etre en chip
jsr AllocMem(a6)
tst.l d0 ; l'accation a bien eu lieu?
beq erreur_cop ; non,alors sortie
move.l d0,coplist ; sauvegarde le pointeur sur la coperlist
; ALLOCATION MEMOIRE DU BUFFER CONTENANT LES POINTS 2d
move.l execbase,a6 ;reserve de la memoire pour la coplist
move.l #NB_POINTS_MAX*2,d0 ; la taille a ete choisie large
move.l #$10000,d1
jsr AllocMem(a6)
tst.l d0 ; l'accation a bien eu lieu?
beq erreur_point ; non,alors sortie
move.l d0,tabpos ; sauvegarde le pointeur sur le buffer
move.w #$8400,DMACONR+COPRBASE ; autorise les DMA blitter
move.w #32,DMACON+COPRBASE ; eteint les sprites
bsr initcop ; initialise la copper list
; ARRET DU MULTITACHE
ifne task_stop
move.l graphbase,a6
jsr OwnBlitter(a6) ; prend le controle du blitter
move.l execbase,a6
jsr Forbid(a6) ; arrete le multitache
move.b #%10000111,$bfd100 ; arrete le drive
endc
; APPEL AU PROGRAMME PRINCIPAL
bsr main_pg ; pg principal
out:
; REMISE EN ROUTE DU MULTITACHE
ifne task_stop
move.l execbase,a6
jsr Permit(a6) ; remet en marche le multitache
move.l graphbase(pc),a6
jsr DisOwnBlitter(a6) ; libere le blitter
endc
; RESTAURE LA COPPER LIST
move.l graphbase,a0
move.l oldcop,$32(a0) ; remet le pointeur de l'ancinne coperlist
; move.l $26(a0),COPRBASE+COP1LCH
move.l execbase,a6
move.l tabpos,a1 ; pointeur sur la zone memoire qui a ete allouer
move.l #NB_POINTS_MAX,d0 ; taille de cette zone memoire
jsr FreeMem(a6) ; desallocation
erreur_point:
move.l execbase,a6
move.l coplist,a1 ; pointeur sur la zone memoire qui a ete allouer
move.l #taillecop,d0 ; taille de cette zone memoire
jsr FreeMem(a6) ; desallocation
erreur_cop:
move.l execbase,a6
move.l abitplane0(pc),a1 ; adresse de la zone memoire
move.l #taillescr*2,d0 ; taille de la zone memoire
jsr FreeMem(a6) ; desaocation
erreur_mem:
bsr freelib ; libere les librairies
move.w #$8020,DMACON+COPRBASE ; autorise les sprites
bsr out_wb
clr.l d0 ; pour signaler au dos qu'il n y pas d'erreur
rts
; WORKBENCH STARTUP CODE
FindTask=-294
WaitPort=-384
GetMsg=-372
;Forbid=-132
ReplyMsg=-378
in_wb: clr.l WBenchMsg ; workbench startup
move.l execbase,a6
sub.l a1,a1
jsr FindTask(a6)
move.l d0,a4
tst.l $ac(a4)
bne du_cli
lea $5c(a4),a0
jsr WaitPort(a6)
lea $5c(a4),a0
jsr GetMsg(a6)
move.l d0,WBenchMsg
du_cli: rts
out_wb: tst.l WBenchMsg
beq pas_work
move.l execbase,a6
jsr Forbid(a6)
move.l WBenchMsg,a1
jsr ReplyMsg(a6)
pas_work:moveq #0,d0
rts
WBenchMsg:
dc.l 0
; ****************
; * PG PRINCIPAL *
; ****************
main_pg:
bsr sync ; attente de la synchro
bsr switch ; switching de page
bsr bltclear ; effacement de l'ecran
bsr initblit ; initialise les registre du blitter pour trace de ligne
bsr affobj ; affiche l'objet
bsr tstclav ; test du clavier
btst #6,$bfe001 ; appui sur le bouuton de la souris?
bne main_pg ; si non, on continue
rts
; ##########################
; Affichage d'un objet en 3d
; ##########################
; Remarque: A4 va par la suite etre utilise comme pointeur
; sur l'objet,ne pas le modifier!
affobj:
move.w numobj(pc),d7 ; numero d'objet courant
lsl.w #2,d7 ; mul*4
lea tabobj(pc),a4 ; table des pointeur sur les objets
move.l (a4,d7.w),a4 ; a4 pointe sur la structure de l'objet
bsr tstangle ; test de depassement des angles
bsr calc_matr ; calcule de la matrice de rotation
bsr calcul_coord ; calcul des coord 2d de chaque point
bsr aff_line ; affichage des lignes de l'objet
rts
; ##############################################
; # TEST SI L'ANGLE CONTENU DANS D0 EST VALIDE #
; ##############################################
tst_borne
tst.w d0 ; l'angle est negatif?
bpl.s rot1
add.w #360,d0 ; si oui,on rajoute 360
rot1: cmp.w #360,d0 ; l'angle est sup a 360
blt.s rot2
sub.w #360,d0 ; si ouion soustrait 360
rot2:
rts
; ###########################
; TEST DE VALIDITE DES ANGLES
; ###########################
tstangle:
lea vitx_a-objet1(a4),a3 ; pointeur sur la vitesse de rot de l'objet
bsr.s un_angle ; angle x
bsr.s un_angle ; angle y
bsr.s un_angle ; anglez
movem.w vitx1-objet1(a4),d0-d2 ; lecture des vitesses de translation
add.w d0,posx1-objet1(a4) ; on aditionne ces vitesses au position
add.w d1,posy1-objet1(a4) ; x y et z de l'objet
add.w d2,posz1-objet1(a4)
rts
; MISE A JOUR ET TEST D'UN ANGLE
un_angle:
move.w (a3),d0 ; recupere la vitesse de rotation
cmp.w #360,d0 ; la vitesse de rotation ne doit pas
blt.s pas_dep ; etre superieure a 360 degre par image
sub.w #360,d0
pas_dep:
cmp.w #-360,d0 ; la vitesse est superieure a - 360 deg?
bgt.s pas_dep2
add.w #360,d0
pas_dep2:
move.w d0,(a3) ; sauve la nouvelle vitesse
add.w anglex1-vitx_a(a3),d0; on ajoute l'angle de l'objet
bsr tst_borne ; verifie si l'angle est compri entre 0 et 360
move.w d0,anglex1-vitx_a(a3); sauvegarde du nouvel angle
addq #2,a3
rts
; ####################
; #SWITCHING DE PAGE #
; ####################
switch:
move.l graphbase(pc),a1
move.l abitplane0(pc),d0 ; d0 et d1 contiennent les
move.l bbitplane0(pc),d1 ; adresses des deux buffers
tst.b flagcop ; autre page?
beq.s next_switch
exg d1,d0 ; on inverse l'ecran physique et logique
next_switch:
move.l d1,bitplane0 ; on sauve l'adresse de l'ecran logique
move.l coplist,$32(a1)
move.l p_bitcop,a0 ; ainsi qu celle de l'ecran physique
bsr initbrush ; met la nouvelle adresse dans la
; coperlist
not.b flagcop ; on indique que les 2 ecrans on ete inverse
rts
p_bitcop:dc.l 0
flagcop:dc.b 0
even
; ATTENTE DE LA SYNCHRO
sync: cmp.b #50,VHPOSR+COPRBASE ; attent la 50eme ligne pour
bne.s sync ; changer d'ecran
rts
; PG D'AFFICHAGE DES LIGNES
aff_line:
move.w nblignes1-objet1(a4),d7 ; nombre de lignes de l'objets
subq #1,d7
move.l tabpos(pc),a5 ; table des positions 2D
move.l descrline1-objet1(a4),a6; table des numeros de points
; a relier
next_aff_line:
move.w (a6)+,d6 ; numero du point de depart
asl.w #2,d6 ; un point=4 octets
movem.w (a5,d6.w),d0/d1 ; coord x et y de depart
move.w (a6)+,d6 ; numero point d'arrivee
asl.w #2,d6 ; mul*4
movem.w (a5,d6.w),d2/d3 ; coord x,y d'arrivee
bsr drawline ; trace d'une ligne
dbf d7,next_aff_line ; tant qu'il y a des lignes
rts
; ##########################################
; # TRANSFORMATION DES COORD 3D EN COORD 2D#
; ##########################################
calcul_coord:
move.l tabpos(pc),a0 ; table qui conteindra les coord 2D
move.l descrtabx1-objet1(a4),a1; table des coord 3d
move.w nbpoints1-objet1(a4),d7 ; nb de points de l'objet
subq #1,d7
loop: movem.w (a1)+,d0-d2 ; coord x,y,z du point
lsl.l #3,d0 ; augmente la precision lors de calculs
lsl.l #3,d1 ; (il y aura plus de chiffres significatifs)
lsl.l #3,d2
bsr rot ; rotation du point->coord xr,yr,zr
bsr calc_coord ; transformation x,y,z en xe,ye
move.w d0,(a0)+ ; sauvegarde de xe
move.w d1,(a0)+ ; sauvegarde de ye
dbf d7,loop ; tant qu'il y a des points
rts
; CALCUL DES COORD ECRANS
; en entree d0,d1,d2 -> x,y,z
; en sortie xe,ye d0,d1
calc_coord:
add.w distz(pc),d2 ; distance de l'ecran
beq no_div ; eviter la div par 0
ext.l d0 ; transformation en mot long
lsl.l #8,d0 ; mult par 256
divs d2,d0 ; xe=x*e/(z+d)
add.w #160,d0 ; centrage sur un ecran de 320 points
ext.l d1
lsl.l #8,d1
divs d2,d1 ; y*e/(z+d)
neg.w d1
add.w #TAILLEY/2,d1 ; centrage
no_div:
rts
; ######################
; ROTATION DANS L'ESPACE
; ######################
; en entree:d0,d1,d2 doivent contenir les angle alpha,teta et phi
calc_matr:
lea tabcos(pc),a3 ; table des cosinus
lea tabsin(pc),a5 ; table des sinus
moveq #0,d0
movem.w anglex1-objet1(a4),d0-d2 ; angles x,y,z
lsl.w #1,d0 ; c'est une table de mots
lsl.w #1,d1
lsl.w #1,d2
move.w (a5,d0.w),cosalpha; sauvegarde des angles
move.w (a3,d0.w),sinalpha
move.w (a5,d1.w),costeta
move.w (a3,d1.w),sinteta
move.w (a5,d2.w),cosphi
move.w (a3,d2.w),sinphi
lea matr(pc),a3
move.w cosalpha(pc),d3
muls costeta(pc),d3
asr.l #7,d3
move.w d3,(a3) ; coef 0,0
move.w sinalpha(pc),d4
muls cosphi(pc),d4
neg.l d4
move.w cosalpha(pc),d6
muls sinteta(pc),d6
muls sinphi(pc),d6
asr.l #7,d6
add.l d6,d4
asr.l #7,d4
move.w d4,2(a3) ; coef 1,0
move.w sinalpha(pc),d5
muls sinphi(pc),d5
move.w cosalpha(pc),d6
muls sinteta(pc),d6
muls cosphi(pc),d6
asr.l #7,d6
add.l d6,d5
asr.l #7,d5
move.w d5,4(a3) ; coef 2,0
move.w sinalpha(pc),d3
muls costeta(pc),d3
asr.l #7,d3
move.w d3,1*6(a3) ; coef 0,1
move.w cosalpha(pc),d4
muls cosphi(pc),d4
move.w sinalpha(pc),d5
muls sinteta(pc),d5
muls sinphi(pc),d5
asr.l #7,d5
add.l d5,d4
asr.l #7,d4
move.w d4,1*6+2(a3) ; coef 1,1
move.w cosalpha(pc),d5
muls sinphi(pc),d5
neg.l d5
move.w sinalpha(pc),d6
muls sinteta(pc),d6
muls cosphi(pc),d6
asr.l #7,d6
add.l d6,d5
asr.l #7,d5
move.w d5,1*6+4(a3) ; coef 2,1
move.w sinteta(pc),d3
neg.l d3
move.w d3,2*6(a3) ; coef 0,2
move.w sinphi(pc),d4
muls costeta(pc),d4
asr.l #7,d4
move.w d4,2*6+2(a3) ; coef 1,2
move.w costeta(pc),d5
muls cosphi(pc),d5
asr.l #7,d5
move.w d5,2*6+4(a3) ; coef 2,2
rts
;#####################
; ROTATION D'UN POINTS
;#####################
; en entree:d0-d2 =coord 3d avant rotation
; en sortie:d0-d2 =coord 3d apres rotation
rot:
movem.l a3/d3-d7,-(a7)
lea matr(pc),a3 ; pointeur sur la matrice de rotation
bsr calc_col ; calcul de la premiere colonne=x
add.w posx1-objet1(a4),d3
move.w d3,-(a7) ; sauve x resultant
bsr calc_col ; deuxieme colonne=y
add.w posy1-objet1(a4),d3
move.w d3,-(a7) ; sauve y resultant
bsr calc_col ; troisieme colonne=z
add.w posz1-objet1(a4),d3
move.w d3,d2 ; z resultant
move.w (a7)+,d1 ; recupere y
move.w (a7)+,d0 ; recupere x
movem.l (a7)+,d3-d7/a3 ; recupere les registres
rts
; porduit matriciel d'une colonne
calc_col:
move.w d0,d3
move.w d1,d4
move.w d2,d5
muls (a3)+,d3
muls (a3)+,d4
muls (a3)+,d5
add.l d4,d3
add.l d5,d3
asr.l #7,d3
rts
cosalpha:dc.w 0
sinalpha:dc.w 0
costeta:dc.w 0
sinteta:dc.w 0
cosphi: dc.w 0
sinphi: dc.w 0
; matrice de la rotation
matr: dcb.w 3*3
;======================================
drawline:
; AFFICHAGE LINE
;D0,D1 : ABSCISSES (INITALE,FINALE)
;D2,D3 : ORDONNEES (INITALE,FINALE)
; Voir Hardware Manuel pour + de details
movem.l a5/a0-a2/d4-d7,-(a7)
lea COPRBASE,a5
sub.w d0,d2 ; calcul de deltax
sub.w d1,d3 ; calcul de deltay
move.b d0,d4
lsl.w #8,d4
lsl.w #4,d4
or.w #%101100000000+$ca,d4
move.l bitplane0(pc),a0
lsr.w #3,d0
and.b #$fe,d0
mulu #40,d1
add.l d1,a0
lea (a0,d0.w),a0 ; a0 = pointeur sur le depart
moveq #0,d0 ;
tst.w d2 ; deltax<0
bpl.s df_xp
eor.b #%011,d0; change de cadrant
neg.w d2
df_xp:
neg.w d3 ; deltay=-deltay
bpl.s df_yp ; deltay<0
eor.b #%111,d0
neg.w d3
df_yp:
cmp.w d2,d3
bmi.s df_xg
move.w d3,d1
eor.b #%001,d0
exg d2,d3
bra.s df_calc
df_xg: move.w d2,d1
df_calc:
bsr waitblit
move.l a0,BLTCPTH(a5)
move.l a0,BLTDPTH(a5)
moveq #0,d6
move.b ft_octs(pc,d0.w),d6
addq.w #1,d1
lsl.w #6,d1
addq #2,d1
move.w d4,BLTCON0(a5)
move.w d3,d0
lsl.w #1,d0
sub.w d2,d0
bge.s df_nosign
or.w #$40,d6
df_nosign:
move.w d6,BLTCON1(a5)
move.w d0,BLTAPTH+2(a5)
lsl.w #2,d3
move.w d3,BLTBMOD(a5)
sub.w d2,d0
lsl.w #1,d0
move.w d0,BLTAMOD(a5)
move.w d1,BLTSIZE(a5) ; START DRAWING
movem.l (a7)+,a5/a0-a2/d4-d7
rts
ft_octs:
dc.b %0011001,%0000101,%0001101,%0011101
dc.b %0010101,%0001001,%0000001,%0010001
; attent que le blitter ait fini
waitblit:
btst #14,DMACONR+COPRBASE
bne waitblit
rts
; INITIALISE CERTAINS REGISTRES DU BLITTE POUR LE TRACER DE
; LIGNES
initblit: ; initialisation lignes blitter
bsr waitblit
lea COPRBASE,a5
move.w #40*prof,d1
move.w d1,BLTCMOD(a5) ;bltcmod:largeur ecran
move.w d1,BLTDMOD(a5) ;bltdmod: " "
moveq #-1,d0
move.l d0,BLTAFWM(a5)
move.l d0,BLTBDAT(a5)
move.w #-$8000,BLTADAT(a5)
rts
; EFFACEMENT AU BLITTER D'UN BITMAP
bltclear:
bsr waitblit
lea COPRBASE,a5
move.l bitplane0(pc),a0 ; adresse de la zone a effacer
move.l a0,BLTDPTH(a5)
move.w #$01f0,BLTCON0(a5) ; destination activee
move.w #$0000,BLTCON1(a5) ;
move.w #0,BLTADAT(a5) ; remplissage de 0
clr.w BLTDMOD(a5) ; modulo=0
move.w #TAILLEY,d0 ; nb de lignes a remplir
lsl.w #6,d0
or.w #20,d0 ; nombre de mots de chaque ligne
move.w d0,BLTSIZE(a5) ; depart de l'effacement
rts
; OUVERTURE DES LIBRAIRIES
initlib:
move.l #grafname,a1 ; nom de la librairie
move.l execbase,a6 ; pointeur sur la librairie EXEC
jsr openlib(a6) ; ouverture de la graphics.library
move.l d0,graphbase ; sauvegarde de la base de la libr.
rts
; REFERME LES LIBRAIRIES
freelib:
move.l graphbase(pc),a1; base de la librairie a fermer
move.l execbase,a6 ; librairie exec
jsr closelib(a6) ; fermeture de la librairie
rts
grafname:dc.b 'graphics.library',0
even
graphbase:dcb.l 1
; TESTE LES TOUCHES DU CLAVIER
tstclav:
sub.b #1,tempo_clav ; temporisation clavier,pour que
beq new_car ; mobile n'aille pas trop vite de suite
rts
new_car:
move.b #5,tempo_clav
move.b $bfec01,d0 ; code de la touche courante
eor.b #$ff,d0
ror.b #1,d0
cmp.b #$50,d0
bne pas_f1
move.w #0,numobj
pas_f1:
cmp.b #$51,d0
bne pas_f2
move.w #1,numobj
pas_f2:
cmp.b #$1e,d0 ; gestion eloignement
bne pasz
subq.w #8,distz
pasz: cmp.b #$3e,d0
bne paszp
addq.w #8,distz
paszp:
cmp.b #$57,d0
cmp.b #$4e,d0 ; gestion anglex
bne pash
addq.w #1,vitx_a-objet1(a4)
pash: cmp.b #$4f,d0
bne pasb
subq.w #1,vitx_a-objet1(a4)
pasb:
cmp.b #$4d,d0 ; gestion angley
bne pasg
addq.w #1,vity_a-objet1(a4)
pasg: cmp.b #$4c,d0
bne pasd
subq.w #1,vity_a-objet1(a4)
pasd:
cmp.b #$0f,d0 ; gestion anglez
bne pasrg
subq.w #1,vitz_a-objet1(a4)
pasrg: cmp.b #$3c,d0
bne pasrd
addq.w #1,vitz_a-objet1(a4)
pasrd:
cmp.b #$45,d0
bne pas_esc
bsr panic
clr.w vitx_a-objet1(a4)
clr.w vity_a-objet1(a4)
clr.w vitz_a-objet1(a4)
pas_esc:
move.b last_touche,d1
move.b d0,last_touche
cmp.b d0,d1
beq sortclav
cmp.b #0,d0
sortclav:
rts
last_touche:dc.b 0
even
panic:
clr.w vitx1-objet1(a4)
clr.w vity1-objet1(a4)
clr.w vitz1-objet1(a4)
clr.w posx1-objet1(a4)
clr.w posy1-objet1(a4)
clr.w posz1-objet1(a4)
rts
tempo_clav:dc.b 10
even
; INITIALISATION DE LA COPPER LIST
initcop:
move.l coplist(pc),a0 ; adresse de la copper list
lea mycop(pc),a1 ; on recopie le debut en chip
tfrcop: move.l (a1)+,(a0)+
cmp.l #fincop,a1
bne tfrcop
move.l a0,p_bitcop ; sauvegarde l'endroit de la coplist
move.l abitplane0,d0 ; ou on initialise les bitlanes
bsr initbrush ; on initialise les adrs des bitplanes
lea mycop2(pc),a1 ; recopie de la fin de la coperlist
tfrcop2:move.l (a1)+,(a0)+
cmp.l #fincop2,a1
bne tfrcop2
move.l graphbase,a0
move.l $32(a0),oldcop ; sauvegarde le pointeur de l'ancienne coplist
move.l coplist,$32(a0); met le nouveau pointeur
; lea COPRBASE,a5
; move.l coplist,COP1LCH(a5)
; clr.w COPJMP1(a5)
rts
; MET DANS LA COPPER LIST LES ADRESSES DES BITPLANES
initbrush: ; d0 contient l'adresse du prem plan
move.w #$00e0,d1 ; adresses de bitp0h
bsr metadr
bsr metadr
rts
metadr: ; cet ici qu'on le met dans la coplist
swap d0
move.w d1,(a0)+
move.w d0,(a0)+
addq.w #2,d1
rts
mycop:
dc.w $1001,$fffe
dc.w $180,0
dc.w $182,$fff
dc.w $130,0,$132,0,$134,0,$136,0
dc.w $138,0,$13a,0,$13c,0,$13e,0
dc.w $008e,$2581
dc.w $0090,$40c1
dc.w $0092,$0038
dc.w $0094,$00cc
dc.w $0100,$1000
dc.w $102,0
dc.w $108,(prof-1)*40
dc.w $10a,(prof-1)*40
fincop:
mycop2:
dc.l $ffddfffe
dc.l $2401fffe
dc.l $01000000
dc.l $fffffffe
fincop2:
coplist: dc.l 0
oldcop: dc.l 0
;DONNES
bitplane0:dcb.l 1
abitplane0:dcb.l 1
bbitplane0:dcb.l 1
tabcos: incbin demos:datasin ; table des sinus et cosinus
tabsin=tabcos+720
tabpos: dc.l 0 ; pointeur sur la table des position 2D
numobj: dc.w 0 ; numero de l'obj en cours
tabobj: dc.l objet1,objet2
null: dc.w 0
; STRUCTURE DEFINISSANT LE PREMIER OBJET
objet1:
nbpoints1:dc.w 20 ; nombre de points
nblignes1:dc.w 32 ; nombre de lignes
descrline1:dc.l tabline1; pointeur sur la table des numero de points
descrtabx1:dc.l itabx1 ; pointeur sur la table des coord 3d de chaque pt
posx1: dc.w 0 ; position x,y,z de l'objet
posy1: dc.w 0
posz1: dc.w 0
anglex1:dc.w 0 ; valeur des angles de l'objet
angley1:dc.w 90
anglez1:dc.w 40
vitx1: dc.w 0 ; vitesses de translation
vity1: dc.w 0
vitz1: dc.w 0
vitx_a: dc.w 0 ; vitesses de rotation
vity_a: dc.w 0
vitz_a: dc.w 0
; table des numero de points formant une ligne
tabline1:
dc.w 0,1,1,2,2,3,3,0,0,4,1,4,2,4,3,4
dc.w 5,6,6,7,7,8,8,5,5,9,6,9,7,9,8,9
dc.w 10,11,11,12,12,13,13,10,10,14,11,14,12,14,13,14
dc.w 15,16,16,17,17,18,18,15,15,19,16,19,17,19,18,19
; table des coord 3d de chaque point
itabx1:
dc.w -10,-10,5,-10,10,5,10,10,5,10,-10,5
dc.w 0,0,15
dc.w -10,-10,-5,-10,10,-5,10,10,-5,10,-10,-5
dc.w 0,0,-15
dc.w -10,-10,-25,-10,10,-25,10,10,-25,10,-10,-25
dc.w 0,0,-20
dc.w -10,-10,25,-10,10,25,10,10,25,10,-10,25
dc.w 0,0,20
objet2:
nbpoints2:dc.w 8 ; nombre de points
nblignes2:dc.w 12 ; nombre de lignes
descrline2:dc.l tabline2; pointeur sur la table des numero de points
descrtabx2:dc.l itabx2 ; pointeur sur la table des coord 3d de chaque p
posx2: dc.w 0,0,0
anglex2:dc.w 0,0,0
vitx2: dc.w 0,0,0
vitx_a2: dc.w 0,0,0
; table des numero de points formant une ligne
tabline2:
dc.w 0,1,1,2,2,3,3,0
dc.w 4,5,5,6,6,7,7,4
dc.w 0,4,1,5,2,6,3,7
; table des coord 3d de chaque point
itabx2:
dc.w -10,-10,-10,-10,10,-10,10,10,-10,10,-10,-10
dc.w -10,-10,10,-10,10,10,10,10,10,10,-10,10
tailleplan=TAILLEY*40
taillescr=tailleplan*prof
taillecop=100
distz:dc.w 600